home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / CODECS.ZIP / codecs / francais / dcodrle2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-13  |  3.4 KB  |  99 lines

  1. /* Fichier: dcodrle2.c
  2.    Auteur: David Bourgin
  3.    Date de creation: 1/2/94
  4.    Date de derniere mise a jour: 22/5/94
  5.    Dessein: Exemple de decodage RLE type 2 avec comme donnees a decompresser le contenu d'un fichier.
  6. */
  7.  
  8. #include <stdio.h>
  9. /* Pour les routines printf,fgetc,fputc */
  10. #include <stdlib.h>
  11. /* Pour la routine exit */
  12.  
  13. /* Codes d'erreur renvoyes a l'appelant */
  14. #define NO_ERROR      0
  15. #define BAD_FILE_NAME 1
  16. #define BAD_ARGUMENT  2
  17.  
  18. /* Constantes pratiques */
  19. #define FALSE 0
  20. #define TRUE  1
  21.  
  22. /* Variables globales */
  23. FILE *f_source,*f_dest;
  24.  
  25.                              /* Puisque fgetc=EOF uniquement apres un acces
  26.                                 alors statut_octet_stocke vaut TRUE si un octet a ete engrange par fgetc
  27.                                 ou FALSE s'il n'y aucun octet valide, deja lu et non traite dans val_octet_stocke */
  28. int statut_octet_stocke=FALSE;
  29. int val_octet_stocke;
  30.  
  31. /* Pseudo procedures */
  32. #define fin_des_donnees() (statut_octet_stocke?FALSE:!(statut_octet_stocke=((val_octet_stocke=fgetc(f_source))!=EOF)))
  33. #define lire_octet()  (statut_octet_stocke?statut_octet_stocke=FALSE,(unsigned char)val_octet_stocke:(unsigned char)fgetc(f_source))
  34. #define ecrire_octet(octet)  ((void)fputc((octet),f_dest))
  35.  
  36. void decodagerle2()
  37. /* Parametres en sortie: Aucun
  38.    Action: Decompresse suivant la methode RLE type 2 tous les octets lus par la fonction lire_octet
  39.    Erreurs: Une erreur d'entree/sortie peut perturber le deroulement de l'algorithme
  40. */
  41. { unsigned char octet_repere,octet_lu,octet_a_repeter;
  42.   register unsigned int i;
  43.  
  44.   if (!fin_des_donnees())
  45.      { octet_repere=lire_octet();
  46.        do {                  /* Puisqu'il y a l'octet repere c'est qu'il y a  des donnees a decompresser */
  47.             if ((octet_lu=lire_octet())==octet_repere)
  48.                { octet_lu=lire_octet();
  49.                  if (octet_lu<3)
  50.                     octet_a_repeter=octet_repere;
  51.                  else octet_a_repeter=lire_octet();
  52.                  for (i=0;i<=octet_lu;i++)
  53.                      ecrire_octet(octet_a_repeter);
  54.                }
  55.             else ecrire_octet(octet_lu);
  56.           }
  57.        while (!fin_des_donnees());
  58.      }
  59. }
  60.  
  61. void aide()
  62. /* Parametres en sortie: Aucun
  63.    Action: Affiche l'aide du programme et termine son execution
  64.    Erreurs: Aucune
  65. */
  66. { printf("Cet utilitaire permet de decompresser un fichier par la methode RLE type 2\n");
  67.   printf("telle qu'elle est exposee dans 'La Video et Les Imprimantes sur PC'\n");
  68.   printf("\nUsage: dcodrle2 source destination\n");
  69.   printf("source: Nom du fichier a decompresser\n");
  70.   printf("destination: Nom du fichier decompresse\n");
  71. }
  72.  
  73. int main(argc,argv)
  74. /* Parametres en sortie: Renvoie un code d'erreur (0=Aucune)
  75.    Action: Procedure principale
  76.    Erreurs: Detectee, traitee et un code d'erreur est renvoye si necessaire
  77. */
  78. int argc;
  79. char *argv[];
  80. { if (argc!=3)
  81.      { aide();
  82.        exit(BAD_ARGUMENT);
  83.      }
  84.   else if ((f_source=fopen(argv[1],"rb"))==NULL)
  85.           { aide();
  86.             exit(BAD_FILE_NAME);
  87.           }
  88.        else if ((f_dest=fopen(argv[2],"wb"))==NULL)
  89.                { aide();
  90.                  exit(BAD_FILE_NAME);
  91.                }
  92.             else { decodagerle2();
  93.                    fclose(f_source);
  94.                    fclose(f_dest);
  95.                  }
  96.   printf("Execution de dcodrle2 achevee.\n");
  97.   return (NO_ERROR);
  98. }
  99.